package serialisation;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.LinkedList;
import java.util.List;

import reservation.Trajet;
import reservation.Transport;

/**
 * Classe SerializeObject : Enregistrement de données dans un fichier texte
 * 
 * @author Alexandre Boursier and Mamadou Diallo and Cyril Gorrieri and Emmanuel
 *         Menage
 * @version 2012.01.23
 */

public class SerializeObject extends Serializer {
	
	public SerializeObject(String fichier) {
		super(fichier);
	}
	
	@Override
	public boolean store(List<Transport> transports,
			List<Trajet> trajets) {
		List<List<?>> obj = new LinkedList<List<?>>();
		obj.add(transports);
		obj.add(trajets);
		return store(obj);
	}

	/**
	 * Serialiser un object dans un fichier
	 * 
	 * @param data
	 * @return true ou false
	 */
	private boolean store(Object data) {
		FileOutputStream f = null;
		ObjectOutputStream out = null;

		// Controler l'existence de la donnee
		if (data == null)
			return false;

		// Construire un fichier logique et le fichier physique associe
		try {
			f = new FileOutputStream(fichier);
		} catch (Exception e) {
			return false;
		}

		// Construire un flux de sortie base sur le fichier logique
		try {
			out = new ObjectOutputStream(f);
		} catch (Exception e) {
			return false;
		}

		// Serialiser l'objet contenant les donnees dans le flux de sortie
		try {
			out.writeObject(data);
		} catch (Exception e) {
			return false;
		}

		try {
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return true;
	}

	/**
	 * Déserialiser un object sous forme de liste
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public boolean load(LinkedList<Transport> transports,
			LinkedList<Trajet> trajets) {
		FileInputStream f = null;
		ObjectInputStream in = null;
		Object resultat = null;

		// Construire un fichier logique correspondant
		try {
			f = new FileInputStream(fichier);
		} catch (FileNotFoundException e) {
			return false;
		}

		// Construire un flux d'entrée base sur le fichier logique
		try {
			in = new ObjectInputStream(f);

			resultat = in.readObject();
			LinkedList<Trajet> trajetsTemp = new LinkedList<Trajet>();
			LinkedList<Transport> transportsTemp = new LinkedList<Transport>();
			
			List<?> t = (List<?>) resultat;
			for (int i = 0; i < t.size(); i++) {
				if (((LinkedList<?>) t.get(i)).size() != 0) {
					if (((LinkedList<?>) t.get(i)).get(0) instanceof Trajet) {
						trajetsTemp = (LinkedList<Trajet>) t.get(i);
					} else if (((LinkedList<?>) t.get(i)).get(0) instanceof Transport) {
						transportsTemp = (LinkedList<Transport>) t.get(i);
					}
				}
			}

			transports.clear();
			trajets.clear();
			for (Transport tr : transportsTemp) {
				transports.add(tr);
			}
			for (Trajet tr : trajetsTemp) {
				trajets.add(tr);
			}
			Transport.setIdent(transports.getLast().getIdentTransport()+1);
			Trajet.setIdent(trajets.getLast().getIdentTrajet()+1);
			
			// Fermer le flux d'entrée base sur le fichier logique
			in.close();
		} catch (Exception e) {}

		return true;
	}

	@Override
	public String getExtention() {
		return "data";
	}
}